package d02_collection;

import java.util.*;
import java.util.function.Consumer;

public class Test01 {
    public static void main(String[] args) {
        /*
        * Collection集合体系
        *  特点：
        *       （1）List系列集合：添加的元素是有序的、可重复、有索引。
        *               ArrayList、LinekdList
        *       （2）Set系列集合：添加的元素是无序、不重复、无索引。
        *               HashSet：无序、不重复、无索引
        *               LinkedHashSet：有序、不重复、无索引
        *               TreeSet：按照大小默认升序排序、不重复、所索引。
        *   */
        //1、ArrayList
        ArrayList<String> list01=new ArrayList<>();
        list01.add("张三");
        list01.add("李四");
        list01.add("王五");
        list01.add("赵六");
        System.out.println(list01);
        System.out.println(list01.get(2));
        //2、Set集合
        HashSet<String> set=new HashSet<>();
        set.add("张三");
        set.add("李四");
        set.add("王五");
        set.add("赵六");
        System.out.println(set);
//        System.out.println(set.g);
        //常用方法
        System.out.println(list01.isEmpty());
        System.out.println(list01.remove("王五"));
        System.out.println(list01);
        System.out.println(list01.contains("李四"));
        System.out.println(list01.contains("王五"));
        Object[] arr=list01.toArray();
        String[] str=list01.toArray(String[]::new);
        System.out.println(str.toString());
/*
* 迭代器
*   是用来遍历集合的专用方式（数组没有迭代器），在Java中迭代器的代表是Iterator
*   */
    Iterator<String> iter=list01.iterator();
//    System.out.println(iter.next());
        while (iter.hasNext()){
            System.out.println(iter.next());
        }
        System.out.println("==================增强for===========================");
        for (String it:list01){
            System.out.println(it);
        }
        System.out.println("==================Lambda遍历===========================");
        list01.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });
        list01.forEach(System.out::println);


        //遍历对象
        Collection<Movie> movies=new ArrayList<>();
        movies.add(new Movie("哪吒2","哪吒",45.2));
        movies.add(new Movie("消失的她","文咏珊",38.5));
        movies.add(new Movie("八角笼","王宝强",30.5));
        movies.add(new Movie("长安三万里","李白",50.2));

        //遍历集合
        for (Movie m:movies){
            System.out.println(m.toString());
        }

        /*
        * 链表：
        *   查询慢、无论查询那个数据都要从头开始
        *   增删相对较快
        *  特点“查询慢、增删相对较快、对首位元素进行增删改查的速度极快
        * */
        LinkedList<String> list=new LinkedList<>();
        list.add("一");
        list.add("二");
        list.add("三");
        list.add("四");
        list.add("五");
        list.add("六");
        System.out.println(list);
        list.addFirst("零");
        list.addLast("七");
        System.out.println(list);
        list.removeFirst();
        System.out.println(list);

        LinkedList<String> stack=new LinkedList<>();
        stack.addFirst("第一颗子弹");
        stack.addFirst("第二颗子弹");
        stack.addFirst("第三颗子弹");
        stack.addFirst("第四颗子弹");
        stack.addFirst("第五颗子弹");
        stack.addFirst("第六颗子弹");
        System.out.println(stack);
        stack.removeFirst();
        stack.removeFirst();
        stack.removeFirst();
        System.out.println(stack);

        //手写链表

        /*Set集合
        *   特点：无序、添加数据的顺序和获取数据的顺序是不一致的；不重复，无索引
        * */
        Set<String> set01=new HashSet<>();
        set01.add("一");
        set01.add("二");
        set01.add("三");
        set01.add("四");
        set01.add("五");
        set01.add("六");
        System.out.println(set01);
        /*
        * hashSet:
        *   哈希值：就是一int类型的数值，java中每个对象都有一个哈希值。
        *   java中的所有对象，都可以调用Object类提供的hashCode方法，返回对象自己的哈希值。
        * 哈希值就是随机数
        *
        *   */

    }
}
//手写链表
class myLinkedList<E>{
     private int size=0;
     myLinkedList.Node<E> first;//头指针

    //定义节点类，用于创建对象节点、封装节点数据和下个节点对象的地址值
    public static class Node<E>{


        E item;
        Node<E> next;//下一个节点的地址
        Node<E> prive;

        public Node(E item, Node<E> next, Node<E> prive) {
            this.item = item;
            this.next = next;
            this.prive = prive;
        }

        }
         public int size(){
            return size;
    }
}

class Movie{
    private String name;
    private String actor;
    private double price;

    public Movie() {
    }

    public Movie(String name, String actor, double price) {
        this.name = name;
        this.actor = actor;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getActor() {
        return actor;
    }

    public void setActor(String actor) {
        this.actor = actor;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Movie{" +
                "name='" + name + '\'' +
                ", actor='" + actor + '\'' +
                ", price=" + price +
                '}';
    }
}
